home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
gfx
/
x11
/
twm_930531.lha
/
twm
/
gram.y
< prev
next >
Wrap
Text File
|
1993-05-29
|
21KB
|
855 lines
/*****************************************************************************/
/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/
/** Salt Lake City, Utah **/
/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/
/** Cambridge, Massachusetts **/
/** **/
/** All Rights Reserved **/
/** **/
/** Permission to use, copy, modify, and distribute this software and **/
/** its documentation for any purpose and without fee is hereby **/
/** granted, provided that the above copyright notice appear in all **/
/** copies and that both that copyright notice and this permis- **/
/** sion notice appear in supporting documentation, and that the **/
/** names of Evans & Sutherland and M.I.T. not be used in advertising **/
/** in publicity pertaining to distribution of the software without **/
/** specific, written prior permission. **/
/** **/
/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/
/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/
/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/
/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
/** OR PERFORMANCE OF THIS SOFTWARE. **/
/*****************************************************************************/
/***********************************************************************
*
* $XConsortium: gram.y,v 1.91 91/02/08 18:21:56 dave Exp $
*
* .twmrc command grammer
*
* 07-Jan-86 Thomas E. LaStrange File created
* 11-Nov-90 Dave Sternlicht Adding SaveColors
* 10-Oct-90 David M. Sternlicht Storing saved colors on root
*
***********************************************************************/
%{
#include <stdio.h>
#include <ctype.h>
#include "twm.h"
#include "menus.h"
#include "list.h"
#include "util.h"
#include "screen.h"
#include "parse.h"
#include <X11/Xos.h>
#include <X11/Xmu/CharSet.h>
static char *Action = "";
static char *Name = "";
static MenuRoot *root, *pull = NULL;
static MenuRoot *GetRoot();
static Bool CheckWarpScreenArg(), CheckWarpRingArg();
static Bool CheckColormapArg();
static void GotButton(), GotKey(), GotTitleButton();
static char *ptr;
static name_list **list;
static int cont = 0;
static int color;
int mods = 0;
unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask);
extern int do_single_keyword(), do_string_keyword(), do_number_keyword();
extern name_list **do_colorlist_keyword();
extern int do_color_keyword(), do_string_savecolor();
int yylineno;
%}
%union
{
int num;
char *ptr;
};
%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
%token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS
%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE
%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING
%token <num> NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION
%token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
%token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
%token <num> NO_STACKMODE
%token <ptr> STRING
%type <ptr> string
%type <num> action button number signed_number full fullkey
%start twmrc
%%
twmrc : stmts
;
stmts : /* Empty */
| stmts stmt
;
stmt : error
| noarg
| sarg
| narg
| squeeze
| ICON_REGION string DKEYWORD DKEYWORD number number
{ AddIconRegion($2, $3, $4, $5, $6); }
| ICONMGR_GEOMETRY string number { if (Scr->FirstTime)
{
Scr->iconmgr.geometry=$2;
Scr->iconmgr.columns=$3;
}
}
| ICONMGR_GEOMETRY string { if (Scr->FirstTime)
Scr->iconmgr.geometry = $2;
}
| ZOOM number { if (Scr->FirstTime)
{
Scr->DoZoom = TRUE;
Scr->ZoomCount = $2;
}
}
| ZOOM { if (Scr->FirstTime)
Scr->DoZoom = TRUE; }
| PIXMAPS pixmap_list {}
| CURSORS cursor_list {}
| ICONIFY_BY_UNMAPPING { list = &Scr->IconifyByUn; }
win_list
| ICONIFY_BY_UNMAPPING { if (Scr->FirstTime)
Scr->IconifyByUnmapping = TRUE; }
| LEFT_TITLEBUTTON string EQUALS action {
GotTitleButton ($2, $4, False);
}
| RIGHT_TITLEBUTTON string EQUALS action {
GotTitleButton ($2, $4, True);
}
| button string { root = GetRoot($2, NULLSTR, NULLSTR);
Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
Scr->Mouse[$1][C_ROOT][0].menu = root;
}
| button action { Scr->Mouse[$1][C_ROOT][0].func = $2;
if ($2 == F_MENU)
{
pull->prev = NULL;
Scr->Mouse[$1][C_ROOT][0].menu = pull;
}
else
{
root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
Scr->Mouse[$1][C_ROOT][0].item =
AddToMenu(root,"x",Action,
NULLSTR,$2,NULLSTR,NULLSTR);
}
Action = "";
pull = NULL;
}
| string fullkey { GotKey($1, $2); }
| button full { GotButton($1, $2); }
| DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
win_list
| ICONMGR_NOSHOW { list = &Scr->IconMgrNoShow; }
win_list
| ICONMGR_NOSHOW { Scr->IconManagerDontShow = TRUE; }
| ICONMGRS { list = &Scr->IconMgrs; }
iconm_list
| ICONMGR_SHOW { list = &Scr->IconMgrShow; }
win_list
| NO_TITLE_HILITE { list = &Scr->NoTitleHighlight; }
win_list
| NO_TITLE_HILITE { if (Scr->FirstTime)
Scr->TitleHighlight = FALSE; }
| NO_HILITE { list = &Scr->NoHighlight; }
win_list
| NO_HILITE { if (Scr->FirstTime)
Scr->Highlight = FALSE; }
| NO_STACKMODE { list = &Scr->NoStackModeL; }
win_list
| NO_STACKMODE { if (Scr->FirstTime)
Scr->StackMode = FALSE; }
| NO_TITLE { list = &Scr->NoTitle; }
win_list
| NO_TITLE { if (Scr->FirstTime)
Scr->NoTitlebar = TRUE; }
| MAKE_TITLE { list = &Scr->MakeTitle; }
win_list
| START_ICONIFIED { list = &Scr->StartIconified; }
win_list
| AUTO_RAISE { list = &Scr->AutoRaise; }
win_list
| MENU string LP string COLON string RP {
root = GetRoot($2, $4, $6); }
menu { root->real_menu = TRUE;}
| MENU string { root = GetRoot($2, NULLSTR, NULLSTR); }
menu { root->real_menu = TRUE; }
| FUNCTION string { root = GetRoot($2, NULLSTR, NULLSTR); }
function
| ICONS { list = &Scr->IconNames; }
icon_list
| COLOR { color = COLOR; }
color_list
| SAVECOLOR
save_color_list
| MONOCHROME { color = MONOCHROME; }
color_list
| DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
if ($2 == F_MENU)
{
pull->prev = NULL;
Scr->DefaultFunction.menu = pull;
}
else
{
root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
Scr->DefaultFunction.item =
AddToMenu(root,"x",Action,
NULLSTR,$2, NULLSTR, NULLSTR);
}
Action = "";
pull = NULL;
}
| WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
Scr->WindowFunction.item =
AddToMenu(root,"x",Action,
NULLSTR,$2, NULLSTR, NULLSTR);
Action = "";
pull = NULL;
}
| WARP_CURSOR { list = &Scr->WarpCursorL; }
win_list
| WARP_CURSOR { if (Scr->FirstTime)
Scr->WarpCursor = TRUE; }
| WINDOW_RING { list = &Scr->WindowRingL; }
win_list
;
noarg : KEYWORD { if (!do_single_keyword ($1)) {
twmrc_error_prefix();
fprintf (stderr,
"unknown singleton keyword %d\n",
$1);
ParseError = 1;
}
}
;
sarg : SKEYWORD string { if (!do_string_keyword ($1, $2)) {
twmrc_error_prefix();
fprintf (stderr,
"unknown string keyword %d (value \"%s\")\n",
$1, $2);
ParseError = 1;
}
}
;
narg : NKEYWORD number { if (!do_number_keyword ($1, $2)) {
twmrc_error_prefix();
fprintf (stderr,
"unknown numeric keyword %d (value %d)\n",
$1, $2);
ParseError = 1;
}
}
;
full : EQUALS keys COLON contexts COLON action { $$ = $6; }
;
fullkey : EQUALS keys COLON contextkeys COLON action { $$ = $6; }
;
keys : /* Empty */
| keys key
;
key : META { mods |= Mod1Mask; }
| SHIFT { mods |= ShiftMask; }
| LOCK { mods |= LockMask; }
| CONTROL { mods |= ControlMask; }
| META number { if ($2 < 1 || $2 > 5) {
twmrc_error_prefix();
fprintf (stderr,
"bad modifier number (%d), must be 1-5\n",
$2);
ParseError = 1;
} else {
mods |= (Mod1Mask << ($2 - 1));
}
}
| OR { }
;
contexts : /* Empty */
| contexts context
;
context : WINDOW { cont |= C_WINDOW_BIT; }
| TITLE { cont |= C_TITLE_BIT; }
| ICON { cont |= C_ICON_BIT; }
| ROOT { cont |= C_ROOT_BIT; }
| FRAME { cont |= C_FRAME_BIT; }
| ICONMGR { cont |= C_ICONMGR_BIT; }
| META { cont |= C_ICONMGR_BIT; }
| ALL { cont |= C_ALL_BITS; }
| OR { }
;
contextkeys : /* Empty */
| contextkeys contextkey
;
contextkey : WINDOW { cont |= C_WINDOW_BIT; }
| TITLE { cont |= C_TITLE_BIT; }
| ICON { cont |= C_ICON_BIT; }
| ROOT { cont |= C_ROOT_BIT; }
| FRAME { cont |= C_FRAME_BIT; }
| ICONMGR { cont |= C_ICONMGR_BIT; }
| META { cont |= C_ICONMGR_BIT; }
| ALL { cont |= C_ALL_BITS; }
| OR { }
| string { Name = $1; cont |= C_NAME_BIT; }
;
pixmap_list : LB pixmap_entries RB
;
pixmap_entries : /* Empty */
| pixmap_entries pixmap_entry
;
pixmap_entry : TITLE_HILITE string { SetHighlightPixmap ($2); }
;
cursor_list : LB cursor_entries RB
;
cursor_entries : /* Empty */
| cursor_entries cursor_entry
;
cursor_entry : FRAME string string {
NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
| FRAME string {
NewFontCursor(&Scr->FrameCursor, $2); }
| TITLE string string {
NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
| TITLE string {
NewFontCursor(&Scr->TitleCursor, $2); }
| ICON string string {
NewBitmapCursor(&Scr->IconCursor, $2, $3); }
| ICON string {
NewFontCursor(&Scr->IconCursor, $2); }
| ICONMGR string string {
NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
| ICONMGR string {
NewFontCursor(&Scr->IconMgrCursor, $2); }
| BUTTON string string {
NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
| BUTTON string {
NewFontCursor(&Scr->ButtonCursor, $2); }
| MOVE string string {
NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
| MOVE string {
NewFontCursor(&Scr->MoveCursor, $2); }
| RESIZE string string {
NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
| RESIZE string {
NewFontCursor(&Scr->ResizeCursor, $2); }
| WAIT string string {
NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
| WAIT string {
NewFontCursor(&Scr->WaitCursor, $2); }
| MENU string string {
NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
| MENU string {
NewFontCursor(&Scr->MenuCursor, $2); }
| SELECT string string {
NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
| SELECT string {
NewFontCursor(&Scr->SelectCursor, $2); }
| KILL string string {
NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
| KILL string {
NewFontCursor(&Scr->DestroyCursor, $2); }
;
color_list : LB color_entries RB
;
color_entries : /* Empty */
| color_entries color_entry
;
color_entry : CLKEYWORD string { if (!do_colorlist_keyword ($1, color,
$2)) {
twmrc_error_prefix();
fprintf (stderr,
"unhandled list color keyword %d (string \"%s\")\n",
$1, $2);
ParseError = 1;
}
}
| CLKEYWORD string { list = do_colorlist_keyword($1,color,
$2);
if (!list) {
twmrc_error_prefix();
fprintf (stderr,
"unhandled color list keyword %d (string \"%s\")\n",
$1, $2);
ParseError = 1;
}
}
win_color_list
| CKEYWORD string { if (!do_color_keyword ($1, color,
$2)) {
twmrc_error_prefix();
fprintf (stderr,
"unhandled color keyword %d (string \"%s\")\n",
$1, $2);
ParseError = 1;
}
}
;
save_color_list : LB s_color_entries RB
;
s_color_entries : /* Empty */
| s_color_entries s_color_entry
;
s_color_entry : string { do_string_savecolor(color, $1); }
| CLKEYWORD { do_var_savecolor($1); }
;
win_color_list : LB win_color_entries RB
;
win_color_entries : /* Empty */
| win_color_entries win_color_entry
;
win_color_entry : string string { if (Scr->FirstTime &&
color == Scr->Monochrome)
AddToList(list, $1, $2); }
;
squeeze : SQUEEZE_TITLE {
if (HasShape) Scr->SqueezeTitle = TRUE;
}
| SQUEEZE_TITLE { list = &Scr->SqueezeTitleL;
if (HasShape && Scr->SqueezeTitle == -1)
Scr->SqueezeTitle = TRUE;
}
LB win_sqz_entries RB
| DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
| DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
win_list
;
win_sqz_entries : /* Empty */
| win_sqz_entries string JKEYWORD signed_number number {
if (Scr->FirstTime) {
do_squeeze_entry (list, $2, $3, $4, $5);
}
}
;
iconm_list : LB iconm_entries RB
;
iconm_entries : /* Empty */
| iconm_entries iconm_entry
;
iconm_entry : string string number { if (Scr->FirstTime)
AddToList(list, $1, (char *)
AllocateIconManager($1, NULLSTR,
$2,$3));
}
| string string string number
{ if (Scr->FirstTime)
AddToList(list, $1, (char *)
AllocateIconManager($1,$2,
$3, $4));
}
;
win_list : LB win_entries RB
;
win_entries : /* Empty */
| win_entries win_entry
;
win_entry : string { if (Scr->FirstTime)
AddToList(list, $1, 0);
}
;
icon_list : LB icon_entries RB
;
icon_entries : /* Empty */
| icon_entries icon_entry
;
icon_entry : string string { if (Scr->FirstTime) AddToList(list, $1, $2); }
;
function : LB function_entries RB
;
function_entries: /* Empty */
| function_entries function_entry
;
function_entry : action { AddToMenu(root, "", Action, NULLSTR, $1,
NULLSTR, NULLSTR);
Action = "";
}
;
menu : LB menu_entries RB
;
menu_entries : /* Empty */
| menu_entries menu_entry
;
menu_entry : string action { AddToMenu(root, $1, Action, pull, $2,
NULLSTR, NULLSTR);
Action = "";
pull = NULL;
}
| string LP string COLON string RP action {
AddToMenu(root, $1, Action, pull, $7,
$3, $5);
Action = "";
pull = NULL;
}
;
action : FKEYWORD { $$ = $1; }
| FSKEYWORD string {
$$ = $1;
Action = $2;
switch ($1) {
case F_MENU:
pull = GetRoot ($2, NULLSTR,NULLSTR);
pull->prev = root;
break;
case F_WARPRING:
if (!CheckWarpRingArg (Action)) {
twmrc_error_prefix();
fprintf (stderr,
"ignoring invalid f.warptoring argument \"%s\"\n",
Action);
$$ = F_NOP;
}
case F_WARPTOSCREEN:
if (!CheckWarpScreenArg (Action)) {
twmrc_error_prefix();
fprintf (stderr,
"ignoring invalid f.warptoscreen argument \"%s\"\n",
Action);
$$ = F_NOP;
}
break;
case F_COLORMAP:
if (CheckColormapArg (Action)) {
$$ = F_COLORMAP;
} else {
twmrc_error_prefix();
fprintf (stderr,
"ignoring invalid f.colormap argument \"%s\"\n",
Action);
$$ = F_NOP;
}
break;
} /* end switch */
}
;
signed_number : number { $$ = $1; }
| PLUS number { $$ = $2; }
| MINUS number { $$ = -($2); }
;
button : BUTTON number { $$ = $2;
if ($2 == 0)
yyerror("bad button 0");
if ($2 > MAX_BUTTONS)
{
$$ = 0;
yyerror("button number too large");
}
}
;
string : STRING { ptr = (char *)malloc(strlen($1)+1);
strcpy(ptr, $1);
RemoveDQuote(ptr);
$$ = ptr;
}
number : NUMBER { $$ = $1; }
;
%%
yyerror(s) char *s;
{
twmrc_error_prefix();
fprintf (stderr, "error in input file: %s\n", s ? s : "");
ParseError = 1;
}
RemoveDQuote(str)
char *str;
{
register char *i, *o;
register n;
register count;
for (i=str+1, o=str; *i && *i != '\"'; o++)
{
if (*i == '\\')
{
switch (*++i)
{
case 'n':
*o = '\n';
i++;
break;
case 'b':
*o = '\b';
i++;
break;
case 'r':
*o = '\r';
i++;
break;
case 't':
*o = '\t';
i++;
break;
case 'f':
*o = '\f';
i++;
break;
case '0':
if (*++i == 'x')
goto hex;
else
--i;
case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
n = 0;
count = 0;
while (*i >= '0' && *i <= '7' && count < 3)
{
n = (n<<3) + (*i++ - '0');
count++;
}
*o = n;
break;
hex:
case 'x':
n = 0;
count = 0;
while (i++, count++ < 2)
{
if (*i >= '0' && *i <= '9')
n = (n<<4) + (*i - '0');
else if (*i >= 'a' && *i <= 'f')
n = (n<<4) + (*i - 'a') + 10;
else if (*i >= 'A' && *i <= 'F')
n = (n<<4) + (*i - 'A') + 10;
else
break;
}
*o = n;
break;
case '\n':
i++; /* punt */
o--; /* to account for o++ at end of loop */
break;
case '\"':
case '\'':
case '\\':
default:
*o = *i++;
break;
}
}
else
*o = *i++;
}
*o = '\0';
}
static MenuRoot *GetRoot(name, fore, back)
char *name;
char *fore, *back;
{
MenuRoot *tmp;
tmp = FindMenuRoot(name);
if (tmp == NULL)
tmp = NewMenuRoot(name);
if (fore)
{
int save;
save = Scr->FirstTime;
Scr->FirstTime = TRUE;
GetColor(COLOR, &tmp->hi_fore, fore);
GetColor(COLOR, &tmp->hi_back, back);
Scr->FirstTime = save;
}
return tmp;
}
static void GotButton(butt, func)
int butt, func;
{
int i;
for (i = 0; i < NUM_CONTEXTS; i++)
{
if ((cont & (1 << i)) == 0)
continue;
Scr->Mouse[butt][i][mods].func = func;
if (func == F_MENU)
{
pull->prev = NULL;
Scr->Mouse[butt][i][mods].menu = pull;
}
else
{
root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
Scr->Mouse[butt][i][mods].item = AddToMenu(root,"x",Action,
NULLSTR, func, NULLSTR, NULLSTR);
}
}
Action = "";
pull = NULL;
cont = 0;
mods_used |= mods;
mods = 0;
}
static void GotKey(key, func)
char *key;
int func;
{
int i;
for (i = 0; i < NUM_CONTEXTS; i++)
{
if ((cont & (1 << i)) == 0)
continue;
if (!AddFuncKey(key, i, mods, func, Name, Action))
break;
}
Action = "";
pull = NULL;
cont = 0;
mods_used |= mods;
mods = 0;
}
static void GotTitleButton (bitmapname, func, rightside)
char *bitmapname;
int func;
Bool rightside;
{
if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) {
twmrc_error_prefix();
fprintf (stderr,
"unable to create %s titlebutton \"%s\"\n",
rightside ? "right" : "left", bitmapname);
}
Action = "";
pull = NULL;
}
static Bool CheckWarpScreenArg (s)
register char *s;
{
XmuCopyISOLatin1Lowered (s, s);
if (strcmp (s, WARPSCREEN_NEXT) == 0 ||
strcmp (s, WARPSCREEN_PREV) == 0 ||
strcmp (s, WARPSCREEN_BACK) == 0)
return True;
for (; *s && isascii(*s) && isdigit(*s); s++) ; /* SUPPRESS 530 */
return (*s ? False : True);
}
static Bool CheckWarpRingArg (s)
register char *s;
{
XmuCopyISOLatin1Lowered (s, s);
if (strcmp (s, WARPSCREEN_NEXT) == 0 ||
strcmp (s, WARPSCREEN_PREV) == 0)
return True;
return False;
}
static Bool CheckColormapArg (s)
register char *s;
{
XmuCopyISOLatin1Lowered (s, s);
if (strcmp (s, COLORMAP_NEXT) == 0 ||
strcmp (s, COLORMAP_PREV) == 0 ||
strcmp (s, COLORMAP_DEFAULT) == 0)
return True;
return False;
}
twmrc_error_prefix ()
{
fprintf (stderr, "%s: line %d: ", ProgramName, yylineno);
}